/*
 * modbus_slave.h
 *
 *  Created on: 2022年2月16日
 *      Author: yjs
 */

#ifndef MODBUS_SLAVE_H_
#define MODBUS_SLAVE_H_
#include "usart.h"
/*
 *********************************************************************************************************
 *
 *	模块名称 : MODEBUS 通信模块 (从站）
 *	文件名称 : modbus_slave.h
 *	版    本 : V1.4
 *	说    明 : 头文件
 *
 *	Copyright (C), 2015-2016, 安富莱电子 www.armfly.com
 *
 *********************************************************************************************************
 */
#include "main.h"

/* 01H 读强制单线圈 */
/* 05H 写强制单线圈 */
#define REG_D01		0x1000
#define REG_D02		0x1001
#define REG_D03		0x1002
#define REG_D04		0x1003
#define REG_DXX 	REG_D04

/* 02H 读取输入状态 */
#define REG_T01		0x1100
#define REG_T02		0x1101
#define REG_T03		0x1102
#define REG_T04		0x1103
#define REG_TXX		REG_T04

/* 03H 读保持寄存器 */
/* 06H 写保持寄存器 */
/* 10H 写多个保存寄存器 */
#define REG_P01		0X2101
#define REG_P02		0X2102
#define REG_P03		0X2103
#define REG_P04		0X2104
#define REG_PXX 	REG_P04

/* 04H 读取输入寄存器(模拟信号) */
#define REG_A01		0x2001
#define REG_A02		0x2002
#define REG_A03		0x2003
#define REG_A04		0x2004
#define REG_AXX		REG_A04

/* RTU 应答代码 */
#define RSP_OK				0		/* 成功 */
#define RSP_ERR_CMD			0x01	/* 不支持的功能码 */
#define RSP_ERR_REG_ADDR	0x02	/* 寄存器地址错误 */
#define RSP_ERR_VALUE		0x03	/* 数据值域错误 */
#define RSP_ERR_WRITE		0x04	/* 写入失败 */

#define S_RX_BUF_SIZE		30
#define S_TX_BUF_SIZE		128

typedef struct {
    uint8_t Slave_addr;
    uint8_t RxBuf[S_RX_BUF_SIZE];
    uint8_t RxCount;
    uint8_t RspCode;
    uint8_t TxBuf[S_TX_BUF_SIZE];
    uint8_t TxCount;
} MODS_T;

#pragma pack(2)
typedef struct {
    /* 01H 05H 读写单个强制线圈 */
    uint16_t D01;
    uint16_t D02;
    uint16_t D03;
    uint16_t D04;

    uint16_t T01;
    uint16_t T02;
    uint16_t T03;
    uint16_t T04;
    /* 03H 06H 读写保持寄存器 */
    uint16_t P01;
    uint16_t P02;
    uint16_t P03;
    uint16_t P04;

    /* 04H 读取模拟量寄存器 */
    uint16_t A01;
    uint16_t A02;
    uint16_t A03;
    uint16_t A04;

} VARS_T;
#pragma pack()
extern MODS_T g_tModS;
extern VARS_T g_tVarS;
/**********************************************/
/*user add*/

/**********************************************/
void MODS_OutQueue(void);
void MODS_Ini(void);
void MODS_Deal(usart_cache* recv);
void MODS_Poll(uint8_t *data, uint16_t len);
void MODS_SendWithCRC(uint8_t *_pBuf, uint8_t _ucLen);
void MODS_SendAckOk(void);
void MODS_SendAckErr(uint8_t _ucErrCode);
uint8_t MODS_ReadCoilValue(uint8_t number);
uint8_t MODS_WriteCoilValue(uint16_t reg, uint16_t value);
uint8_t MODS_ReadDisValue(uint8_t number);
uint8_t MODS_ReadRegValue(uint16_t reg_addr, uint8_t *reg_value);
uint8_t MODS_WriteRegValue(uint16_t reg_addr, uint16_t reg_value);
uint8_t MODS_ReadInputValue(uint16_t reg_addr, uint8_t *reg_value);
void MODS_AnalyzeApp(void);
void MODS_01H(void);
void MODS_02H(void);
void MODS_03H(void);
void MODS_04H(void);
void MODS_05H(void);
void MODS_06H(void);
void MODS_0FH(void);
void MODS_10H(void);

/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/

#endif /* MODBUS_SLAVE_H_ */
